#include <cconta.h>

COLS::COLS()
	{
	int i=7,j;
	add(codigo);
	add(campo_bool);
	for (j=0; j < i ; j++)
		{
		add(campo[j]);
		}
	}

COLS::~COLS()
	{
	}

CCONTA::CCONTA(BANCOPG *con, int jan)
	{
	string aux;
	conn = con;
	janela = jan;
	aux.clear();
	aux.append(IMG_PATH);
	aux+="caixa.ico";
	icone=Gdk::Pixbuf::create_from_file (aux);
	preparar();
	}

CCONTA::~CCONTA()
	{
	}

void CCONTA::preparar()
	{
	int i;
	switch(janela)
		{
		case 1:
			{
			Janela = new Gtk::Window();
			Janela->set_title(Glib::ustring("Conta Corrente - Cadastro"));
			Janela->set_icon(icone);
			Janela->set_size_request (400,400);
			Janela->set_position(Gtk::WIN_POS_CENTER);
			Janela->signal_hide().connect(sigc::bind<Gtk::Window*>(sigc::mem_fun(*this,&CCONTA::sair),Janela));
			Janela->signal_show().connect(sigc::bind<int>(sigc::mem_fun(*this,&CCONTA::acoes),1));
			Box[3] = new Gtk::VBox(false,0);
			TBCadastro = new Gtk::Toolbar ();
			TBTCadastro[0] = new Gtk::ToolButton (Gtk::Stock::NEW);
			TBTCadastro[0]->set_tooltip_text (Glib::ustring("Novo Registro"));
			TBTCadastro[0]->signal_clicked ().connect(sigc::mem_fun(*this,&CCONTA::novo));
			TBCadastro->append (*TBTCadastro[0]);
			TBTCadastro[1] = new Gtk::ToolButton (Gtk::Stock::EDIT);
			TBTCadastro[1]->set_tooltip_text (Glib::ustring("Alterar Registro"));
			TBTCadastro[1]->signal_clicked ().connect(sigc::mem_fun(*this,&CCONTA::editar));
			TBCadastro->append (*TBTCadastro[1]);
			TBTCadastro[2] = new Gtk::ToolButton (Gtk::Stock::DELETE);
			TBTCadastro[2]->set_tooltip_text (Glib::ustring("Excluir Registro"));
			TBTCadastro[2]->signal_clicked ().connect(sigc::mem_fun(*this,&CCONTA::deletar));
			TBCadastro->append (*TBTCadastro[2]);
			TBTCadastro[3] = new Gtk::ToolButton (Gtk::Stock::PRINT);
			TBTCadastro[3]->set_tooltip_text (Glib::ustring("Imprimir Relatório"));
			TBTCadastro[3]->signal_clicked ().connect(sigc::mem_fun(*this,&CCONTA::imprimir));
			TBCadastro->append (*TBTCadastro[3]);
			Box[3]->pack_start(*TBCadastro,false,false,0);
			Abas = new Gtk::Notebook ();
			Abas->signal_switch_page ().connect(sigc::mem_fun(*this,&CCONTA::aba_selecionada));
			Box[0] = new Gtk::VBox(false,0);
			SW = new Gtk::ScrolledWindow ();
			SW->set_policy (Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
			TVCadastro[0] = new Gtk::TreeView ();
			dados_cad[0] = Gtk::ListStore::create(arvore);
			TVCadastro[0]->set_model(dados_cad[0]);
			//TBCadastro[0]->signal_row_activated ().connect (sigc::mem_fun(*this,&PRINCIPAL::selecionar_recibo));
			TVCadastro[0]->remove_all_columns ();
			TVCadastro[0]->append_column (Glib::ustring("Banco"), arvore.campo[0]);
			TVCadastro[0]->append_column (Glib::ustring("Agência"), arvore.campo[1]);
			TVCadastro[0]->append_column (Glib::ustring("Conta"), arvore.campo[2]);
			TVCadastro[0]->append_column (Glib::ustring("Descrição"), arvore.campo[3]);
			TVCadastro[0]->append_column (Glib::ustring("Tipo"), arvore.campo[4]);
			TVCadastro[0]->append_column (Glib::ustring("Saldo Inv"), arvore.campo_bool);
			for(i=0; i < 6; i++)
				{
				Gtk::TreeView::Column* coluna_temp = TVCadastro[0]->get_column(i);
				coluna_temp->set_reorderable();	
				}
			SW->add(*TVCadastro[0]);
			Box[0]->pack_start(*SW);
			Abas->append_page (*Box[0], Glib::ustring("Bancos"));
			Box[1] = new Gtk::VBox(false,0);
			SW = new Gtk::ScrolledWindow ();
			SW->set_policy (Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
			TVCadastro[1] = new Gtk::TreeView ();
			dados_cad[1] = Gtk::ListStore::create(arvore);
			TVCadastro[1]->set_model(dados_cad[1]);
			//TBCadastro[1]->signal_row_activated ().connect (sigc::mem_fun(*this,&PRINCIPAL::selecionar_recibo));
			TVCadastro[1]->remove_all_columns ();
			TVCadastro[1]->append_column (Glib::ustring("Código"), arvore.campo[0]);
			TVCadastro[1]->append_column (Glib::ustring("Descrição"), arvore.campo[1]);
			for(i=0; i < 2; i++)
				{
				Gtk::TreeView::Column* coluna_temp = TVCadastro[1]->get_column(i);
				coluna_temp->set_reorderable();	
				}
			SW->add(*TVCadastro[1]);
			Box[1]->pack_start(*SW);
			Abas->append_page (*Box[1], Glib::ustring("Históricos"));
			Box[2] = new Gtk::VBox(false,0);
			SW = new Gtk::ScrolledWindow ();
			SW->set_policy (Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
			TVCadastro[2] = new Gtk::TreeView ();
			dados_cad[2] = Gtk::ListStore::create(arvore);
			TVCadastro[2]->set_model(dados_cad[2]);
			//TBCadastro[2]->signal_row_activated ().connect (sigc::mem_fun(*this,&PRINCIPAL::selecionar_recibo));
			TVCadastro[2]->remove_all_columns ();
			TVCadastro[2]->append_column (Glib::ustring("Classe"), arvore.campo[0]);
			TVCadastro[2]->append_column (Glib::ustring("Descrição"), arvore.campo[1]);
			TVCadastro[2]->append_column (Glib::ustring("Classe Contábil"), arvore.campo[2]);
			TVCadastro[2]->append_column (Glib::ustring("Título"), arvore.campo[3]);
			for(i=0; i < 4; i++)
				{
				Gtk::TreeView::Column* coluna_temp = TVCadastro[2]->get_column(i);
				coluna_temp->set_reorderable();	
				}
			SW->add(*TVCadastro[2]);
			Box[2]->pack_start(*SW);
			Abas->append_page (*Box[2], Glib::ustring("Contas"));
			Box[3]->pack_start(*Abas,true,true,0);
			Janela->add(*Box[3]);
			Janela->show_all();
			break;
			}
		}
	}

void CCONTA::sair (Gtk::Window *w)
	{
	w->hide();
	}

void CCONTA::aba_selecionada(GtkNotebookPage *pagina, guint numero)
	{
	n_page = numero;
	switch(n_page)
		{
		case 0:
			{
			Janela->resize (510,440);
			break;
			}
		case 1:
			{
			Janela->resize (300,440);
			break;
			}
		case 2:
			{
			Janela->resize (920,440);
			break;
			}
		default:
			{
			Janela->resize (400,440);
			break;
			}
		}
	//Janela->set_position(Gtk::WIN_POS_CENTER);
	carregar_dados();
	}

void CCONTA::acoes(int modo)
	{
	switch(janela)
		{
		case 1:
			{
			switch(modo)
				{
				case 1:
					{
					TBTCadastro[0]->set_sensitive (true);
					TBTCadastro[1]->set_sensitive (false);
					TBTCadastro[2]->set_sensitive (false);
					TBTCadastro[3]->set_sensitive (true);
					break;
					}
				}
			break;
			}
		}
	}

void CCONTA::novo()
	{
	Novo = new Gtk::Window();
	Novo->set_icon(icone);
	Novo->set_position(Gtk::WIN_POS_CENTER);
	Novo->signal_hide().connect(sigc::bind<Gtk::Window*>(sigc::mem_fun(*this,&CCONTA::sair),Novo));
	switch(n_page)
		{
		case 0:
			{
			Novo->set_title(Glib::ustring("Cadastro::Bancos"));
			break;
			}
		case 1:
			{
			Novo->set_title(Glib::ustring("Cadastro::Históricos"));
			break;
			}
		case 2:
			{
			Novo->set_title(Glib::ustring("Cadastro::Contas"));
			break;
			}
		}
	Novo->show_all();
	Gtk::Main::run(*Novo);
	}

void CCONTA::editar()
	{
	
	}

void CCONTA::deletar()
	{
	
	}

void CCONTA::imprimir()
	{
	
	}

void CCONTA::carregar_dados()
	{
	char *sql;
	string SQL;
	int registros, colunas, i, j, x, it, cod;
	vector<vector<string> >::iterator ir;
	vector<string> linha;

	SQL.clear();
	switch(janela)
		{
		case 1:
			{
			//cout << "chamou " << endl;
			switch(n_page)
				{
				case 0:
					{
					SQL = "select * from contas.banco order by ordem";
					sql = new char[SQL.length()+1];
					strcpy(sql,SQL.c_str());
					conn->executar(sql);
					delete sql;
					if (conn->query_result != 3)
						{
						registros = conn->registros;
						colunas = conn->colunas;
						if (registros > 0)
							{
							conn->resultado();
							dados_cad[0] = Gtk::ListStore::create(arvore);
							TVCadastro[0]->set_model(dados_cad[0]);
							for (ir = conn->resultados.begin(); ir < conn->resultados.end(); ir++)
								{
								linha = *ir;
								celula = *(dados_cad[0]->append());
								celula[arvore.codigo] = atoi(linha.at(0).c_str());
								celula[arvore.campo[0]] = linha.at(1);
								celula[arvore.campo[1]] = linha.at(2);
								celula[arvore.campo[2]] = linha.at(3);
								celula[arvore.campo[3]] = linha.at(4);
								cod = atoi(linha.at(5).c_str());
								if (cod == 1)
									{
									celula[arvore.campo[4]] = Glib::ustring("Física");
									}
								else if (cod == 2)
									{
									celula[arvore.campo[4]] = Glib::ustring("Jurídica");
									}
								else
									{
									celula[arvore.campo[4]] = Glib::ustring("Não Definido");
									}
								if (linha.at(6).compare("t") == 0)
									{
									celula[arvore.campo_bool] = true;
									}
								else
									{
									celula[arvore.campo_bool] = false;
									}
								}
							TVCadastro[0]->remove_all_columns ();
							TVCadastro[0]->append_column (Glib::ustring("Banco"), arvore.campo[0]);
							TVCadastro[0]->append_column (Glib::ustring("Agência"), arvore.campo[1]);
							TVCadastro[0]->append_column (Glib::ustring("Conta"), arvore.campo[2]);
							TVCadastro[0]->append_column (Glib::ustring("Descrição"), arvore.campo[3]);
							TVCadastro[0]->append_column (Glib::ustring("Tipo"), arvore.campo[4]);
							TVCadastro[0]->append_column (Glib::ustring("Saldo Inv"), arvore.campo_bool);
							for(i=0; i < 6; i++)
								{
								Gtk::TreeView::Column* coluna_temp = TVCadastro[0]->get_column(i);
								coluna_temp->set_reorderable();	
								}
							}
						}
					break;
					}
				case 1:
					{
					SQL = "select * from contas.historico";
					sql = new char[SQL.length()+1];
					strcpy(sql,SQL.c_str());
					conn->executar(sql);
					delete sql;
					if (conn->query_result != 3)
						{
						registros = conn->registros;
						colunas = conn->colunas;
						if (registros > 0)
							{
							conn->resultado();
							dados_cad[1] = Gtk::ListStore::create(arvore);
							TVCadastro[1]->set_model(dados_cad[1]);
							for (ir = conn->resultados.begin(); ir < conn->resultados.end(); ir++)
								{
								linha = *ir;
								celula = *(dados_cad[1]->append());
								celula[arvore.codigo] = atoi(linha.at(0).c_str());
								celula[arvore.campo[0]] = linha.at(0);
								celula[arvore.campo[1]] = linha.at(1);
								}
							TVCadastro[1]->remove_all_columns ();
							TVCadastro[1]->append_column (Glib::ustring("Código"), arvore.campo[0]);
							TVCadastro[1]->append_column (Glib::ustring("Descrição"), arvore.campo[1]);
							for(i=0; i < 2; i++)
								{
								Gtk::TreeView::Column* coluna_temp = TVCadastro[1]->get_column(i);
								coluna_temp->set_reorderable();	
								}
							}
						}
					break;
					}
				case 2:
					{
					SQL = "select * from contas.classificacao order by classe";
					sql = new char[SQL.length()+1];
					strcpy(sql,SQL.c_str());
					conn->executar(sql);
					delete sql;
					if (conn->query_result != 3)
						{
						registros = conn->registros;
						colunas = conn->colunas;
						if (registros > 0)
							{
							conn->resultado();
							dados_cad[2] = Gtk::ListStore::create(arvore);
							TVCadastro[2]->set_model(dados_cad[2]);
							for (ir = conn->resultados.begin(); ir < conn->resultados.end(); ir++)
								{
								linha = *ir;
								celula = *(dados_cad[2]->append());
								celula[arvore.codigo] = atoi(linha.at(0).c_str());
								celula[arvore.campo[0]] = linha.at(1);
								celula[arvore.campo[1]] = linha.at(2);
								celula[arvore.campo[2]] = linha.at(3);
								cod = atoi(linha.at(4).c_str());
								switch (cod)
									{
									case 1:
										{
										celula[arvore.campo[3]] = Glib::ustring("Título");
										break;
										}
									case 2:
										{
										celula[arvore.campo[3]] = Glib::ustring("Sub-Título");
										break;
										}
									case 3:
										{
										celula[arvore.campo[3]] = Glib::ustring("Saldo");
										break;
										}
									}
								}
							TVCadastro[2]->remove_all_columns ();
							TVCadastro[2]->append_column (Glib::ustring("Classe"), arvore.campo[0]);
							TVCadastro[2]->append_column (Glib::ustring("Descrição"), arvore.campo[1]);
							TVCadastro[2]->append_column (Glib::ustring("Classe Contábil"), arvore.campo[2]);
							TVCadastro[2]->append_column (Glib::ustring("Título"), arvore.campo[3]);
							for(i=0; i < 4; i++)
								{
								Gtk::TreeView::Column* coluna_temp = TVCadastro[2]->get_column(i);
								coluna_temp->set_reorderable();	
								}
							}
						}
					break;
					}
				}
			break;
			}
		}
	}